/**
 * @file plane_slicer_raster_planner.h
 * @copyright Copyright (c) 2021, Southwest Research Institute
 *
 * @par License
 * Software License Agreement (Apache License)
 * @par
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * @par
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#pragma once

// 引入 raster_planner.h 文件，定义了 RasterPlanner 类
#include <noether_tpp/tool_path_planners/raster/raster_planner.h>

namespace noether
{
// 在 noether 命名空间中定义 PlaneSlicerRasterPlanner 类

/**
 * @brief 一个基于一系列平行切割平面的 Raster Planner 实现。
 *        该实现最适用于大致平面形状的零件。
 */
class PlaneSlicerRasterPlanner : public RasterPlanner
{
public:
  /**
   * @brief 构造函数，用于初始化 PlaneSlicerRasterPlanner 对象。
   * @param dir_gen 指向 DirectionGenerator 类型的常量指针，表示方向生成器。
   * @param origin_gen 指向 OriginGenerator 类型的常量指针，表示起始点生成器。
   */
  PlaneSlicerRasterPlanner(DirectionGenerator::ConstPtr dir_gen, OriginGenerator::ConstPtr origin_gen);

  /**
   * @brief 设置搜索半径，用于法线计算。
   * @param search_radius 搜索半径（单位：米）。
   */
  void setSearchRadius(const double search_radius);

  /**
   * @brief 设置最小有效段长度。
   * @param min_segment_size 最小段长度（单位：米）。
   */
  void setMinSegmentSize(const double min_segment_size);

protected:
  /**
   * @brief 规划工具路径的实现方法。
   * @param mesh 输入的网格（PolygonMesh 类型）。
   * @return 返回计算出的工具路径（ToolPaths 类型）。
   */
  ToolPaths planImpl(const pcl::PolygonMesh& mesh) const;

private:
  /** @brief 最小有效段的长度（单位：米） */
  double min_segment_size_;

  /** @brief 用于法线计算的搜索半径（单位：米） */
  double search_radius_;
};

}  // namespace noether